package com.cl.oauth.core.common.config;

import com.cl.oauth.core.common.utils.JacksonRedisTokenStoreSerializationStrategy;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.security.oauth2.provider.token.DefaultAccessTokenConverter;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;

import javax.sql.DataSource;

/**
 * token的公用config。
 * todo 目前使用形式为Jwt，后期修改为自定义的redis和mysql
 *  这个需要评估一下是否需要mysql了。
 */
@Configuration
public class TokenConfig {
    // 在开发测试阶段，现在这里写死方便测试和开发
    private static final String SIGNING_KEY = "uaa123";

    @Autowired
    private RedisConnectionFactory redisConnectionFactory;

    @Autowired
    DataSource dataSource;

    @Bean
    public TokenStore tokenStore() {
        //JWT令牌存储方案。如果说，在权限过多，或者要处理的信息过多的情况下，还使用jwt会不会造成请求头过大的情况？
//        return new JdbcTokenStore(dataSource);
        RedisTokenStore redisTokenStore = new RedisTokenStore(redisConnectionFactory);
        redisTokenStore.setSerializationStrategy(new JacksonRedisTokenStoreSerializationStrategy());
        return redisTokenStore;
    }

    @Bean
    public DefaultAccessTokenConverter accessTokenConverter() {
//        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
//        // 暂时使用对称加密算法，之后 可以修改为非对称加密算法
//        converter.setSigningKey(SIGNING_KEY); //对称秘钥，资源服务器使用该秘钥来验证
        DefaultAccessTokenConverter defaultAccessTokenConverter = new DefaultAccessTokenConverter();
        return defaultAccessTokenConverter;
    }
}
